package com.atguigu.tingshu.common.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j
@Component //必须注入到容器中
public class FeignAddHeaderIntercetpor implements RequestInterceptor {
    /*
        RequestInterceptor只会对openfeign发起远程调用时生效
        - 拦截请求，可以配置或者校验请求报文

        OpenFeign: 声明式的web客户端
            - feign客户端 只需要声明要访问的资源配置  由它帮助我们转换Http请求
                封装请求报文： 根据feign客户端的 抽象方法+注解配置
                            生成请求报文首行、头、体 传入参数的设置
                解析响应报文： 根据访问的接口响应的结果解析 转为抽象方法返回值类型对象

            -- 异步编排：
                使用了子线程
                导致子线程 远程调用时，没有客户端发起请求的request对象(ThreadLocal)
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取请求报文中的token
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //配置请求头
        if(attributes!=null){
            requestTemplate.header("token" ,
                    attributes.getRequest().getHeader("token"));
        }

    }
}
